package main.java.juego;
import java.util.*;

import main.java.factorias.FactoriaCartas;
import main.java.tipos.CartaAlemania;
import main.java.tipos.CartaAliados;

import main.java.factorias.*;

public class BarajaImpl implements Baraja{

	/**
	 * @uml.property  name="retrasos"
	 */
	private int retrasos;
	/**
	 * @uml.property  name="mazoAlemania" multiplicity="(0 -1)"
	 */
	private Stack<CartaAlemania> mazoAlemania;
	/**
	 * @uml.property  name="mazoAliado" multiplicity="(0 -1)"
	 */
	private Stack<CartaAliados> mazoAliado;
	
	public BarajaImpl(){
		mazoAlemania = new Stack<CartaAlemania>();
		mazoAliado = new Stack<CartaAliados>();
		List<CartaAlemania> listaCartasAlemania = FactoriaCartas.cargarCartasAlemania();
		setMazoAlemania(listaCartasAlemania);
		List<CartaAliados> listaCartasAliados = FactoriaCartas.cargarCartasAliados();
		setMazoAliado(listaCartasAliados);
		retrasos = 0;
	}
	
	@Override
	public void anadeRetraso() {
		retrasos++;
		
	}
	
	@Override
	public int dameRetrasos() {
		return retrasos;
	}
	
	@Override
	public CartaAlemania reparteAlemana() {
		return mazoAlemania.pop();
	}
	
	@Override
	public CartaAliados reparteAliada() {
		return mazoAliado.pop();
	}
	
	@Override
	public void vuelveInsertar(List<CartaAliados> listaCartas) {
		for(CartaAliados c:listaCartas){
			mazoAliado.push(c);
		}
		barajar("aliados");
	}
	@Override
	public void barajar(String mazo) {
		if(mazo.equals("aliados")){
			Collections.shuffle(mazoAliado);
		}else{
			Collections.shuffle(mazoAlemania);
		}
		
	}

	private void setMazoAlemania(List<CartaAlemania> listaAlemania) {
		for(CartaAlemania c:listaAlemania){
			mazoAlemania.push(c);
		}
		barajar("alemania");
		
	}

	private void setMazoAliado(List<CartaAliados> listaAliado) {
		for(CartaAliados c:listaAliado){
			mazoAliado.push(c);
		}
		barajar("aliados");
	}

	@Override
	public boolean mazoAliadoVacio() {
		// TODO Auto-generated method stub
		//Total de cartas aliados tiene que ser multiplo de 4:
		return mazoAliado.isEmpty();
	}

	@Override
	public boolean mazoAlemanVacio() {
		// TODO Auto-generated method stub
		return mazoAlemania.isEmpty() || mazoAlemania.size()<7;
	}

	public int getRetrasos() {
		return retrasos;
	}

	public Stack<CartaAlemania> getMazoAlemania() {
		return mazoAlemania;
	}

	public Stack<CartaAliados> getMazoAliado() {
		return mazoAliado;
	}

	@Override
	public Integer getCartasAlemanasRestantes() {
		// TODO Auto-generated method stub
		return mazoAlemania.size();
	}

	@Override
	public Integer getCartasAliadasRestantes() {
		// TODO Auto-generated method stub
		return mazoAliado.size();
	}


}
